package site.addzero.util

import org.koin.core.annotation.Single
import site.addzero.cli.setting.SettingContext.HOME_DIR
import java.io.File

@Single
class SourcePathResolver {
    /**
     * 智能解析sourcePath为绝对路径
     *
     * @param sourcePath 用户输入的路径
     * @param abs 是否强制使用绝对路径模式
     * @return 解析后的绝对路径，如果文件不存在则返回null
     */
    fun resolveSourcePath(sourcePath: String, abs: Boolean): String? {
        // 智能判断：如果sourcePath已经是绝对路径（以/、~、${HOME}或$HOME开头），则忽略abs参数
        val isAlreadyAbsolutePath = isAbsolutePath(sourcePath)
        
        val filePath = if (!abs && !isAlreadyAbsolutePath) {
            // 相对路径模式：拼接家目录
            File(HOME_DIR, normalizePath(sourcePath))
        } else {
            // 绝对路径模式或sourcePath本身已经是绝对路径
            val path = resolveSpecialHomePaths(sourcePath)
            File(normalizePath(path))
        }
        
        // 如果文件不存在，返回null
        if (!filePath.exists()) return null
        
        // 返回绝对路径
        return filePath.absolutePath
    }
    
    /**
     * 判断路径是否为绝对路径
     */
    private fun isAbsolutePath(sourcePath: String): Boolean {
        return sourcePath.startsWith(File.separator) || 
            sourcePath.startsWith("~") || 
            sourcePath.startsWith("\${HOME}") || 
            sourcePath.startsWith("\$HOME")
    }
    
    /**
     * 解析特殊HOME路径前缀
     */
    private fun resolveSpecialHomePaths(sourcePath: String): String {
        return when {
            sourcePath.startsWith("~") -> sourcePath.replaceFirst("~", HOME_DIR)
            sourcePath.startsWith("\${HOME}") -> sourcePath.replaceFirst("\${HOME}", HOME_DIR)
            sourcePath.startsWith("\$HOME") -> sourcePath.replaceFirst("\$HOME", HOME_DIR)
            else -> sourcePath
        }
    }
    
    /**
     * 规范化路径，处理多余的斜杠
     */
    private fun normalizePath(path: String): String {
        // 处理路径中的多余斜杠，但保留协议部分的双斜杠（如http://, file://等）
        var normalized = path
        // 处理开头的斜杠
        normalized = normalized.replace(Regex("^" + Regex.escape(File.separator) + "+"), File.separator)
        // 处理中间和末尾的多余斜杠
        normalized = normalized.replace(Regex(Regex.escape(File.separator) + "+"), File.separator)
        // 处理目录遍历符号
        normalized = normalized.replace(Regex(Regex.escape(File.separator) + "\\." + Regex.escape(File.separator)), File.separator)
        // 处理结尾的斜杠（除非是根目录）
        if (normalized.length > 1) {
            normalized = normalized.trimEnd(File.separatorChar)
        }
        return normalized
    }
}